import { Task } from "../../app_base/module/task/Task";
import { TaskQueue } from "../../app_base/module/task/TaskQueue";
import { G_Data } from "../../data/DataCenter";
import { TaskLoadConfig } from "./TaskLoadConfig";
import { TaskLoadNextScene } from "./TaskLoadNextScene";
import { TaskLoadRes } from "./TaskLoadRes";
import { ViewControl } from "../../app_cocos/View/ViewControl";

/**
 @name: BootControl
 @desc: 游戏预加载控制器，负责[版本检测]、[网络连接]、[数据请求]、[预加载资源]、[登录]等逻辑
 @author: timoo
 @date: 2022/12/20
 */
export class BootControl extends ViewControl {
    private _task: TaskQueue = new TaskQueue();

    /**
     * 第一屏显示后，初始化第一屏内信息
     * @returns 
     */
    public init() {
        return Promise.all([
            //todo 版本检测

            //获取服务器配置
            G_Data.server.requestConfig(),

            //...其他预加载promise
        ])
    }

    /**
     * 模拟登录，获取玩家信息
     */
    public login(): Promise<boolean> {
        return G_Data.role.login();
    }

    /**
     * 开始加载
     * @param data 
     */
    public load(nextScenePath: string): void {
        //加载素材
        this._task.addTask(new TaskLoadRes());
        //加载配置
        this._task.addTask(new TaskLoadConfig());
        //预加载主场景
        this._task.addTask(new TaskLoadNextScene(), nextScenePath);


        //并行执行后续任务
        this._task.on(Task.Event.COMPLETE, this, this._onTaskEvent);
        this._task.on(Task.Event.ERROR, this, this._onTaskEvent);
        this._task.on(Task.Event.PROGRESS, this, this._onTaskEvent);
        this._task.start();
    }

    private _onTaskEvent(type: string, task: Task, ...datas: any[]): void {
        this.event(type, [task, ...datas]);
    }

    public destroy(): void {
        this._task && this._task.destroy();
        this._task = null;
    }
}